Computer systems typically comprise a combination of computer programs and hardware, such as semiconductors, transistors, chips, circuit boards, storage devices, and processors. The computer programs are stored in the storage devices and are executed by the processors. Locating, analyzing, and correcting suspected faults in a computer program is a process known as “debugging.” Bugs are problems, faults, or errors in a computer program. Typically, a programmer uses another computer program commonly known as a debugger to debug the program under development.
Conventional debuggers typically support three primary types of operations, which a computer programmer may request via a user interface. A first type is a breakpoint or address watch operation, which permits a programmer to identify with a breakpoint a precise instruction at which to halt execution of the program by the processor, or identify via an address watch, a memory location for the processor to monitor for content modification, at which time the program's execution is halted. The debugger may set a breakpoint by replacing a valid instruction at the location specified by the programmer with an invalid instruction, which causes a system exception when the program attempts to execute the invalid instruction, giving control of the processor to the debugger. The debugger may set an address watch via a function of the processor. As a result, when a program is executed by the debugger, the program executes on the processor in a normal fashion until the breakpoint is reached or the contents of the monitored memory location are written to, at which time the debugger halts execution of the program. A second type is a step operation, which permits a computer programmer to cause the processor to execute instructions in a program either one-by-one or in groups. After each instruction or group of instructions are executed, the debugger then halts execution of the program. Once the execution of the program is halted, either by step or breakpoint operations, conventional debuggers provide a third type of operation, which displays the content that is stored at various storage locations, in response to requests by the programmer. By this debugging process of halting the program at various instructions and examining the content of various storage locations, the programmer might eventually find the storage location whose stored content, such as an instruction or data, is incorrect or unexpected.
Some debuggers are used to debug programs created by optimizing compilers. An optimizing compiler may perform optimizations on programs that result in the values of variables used by the programs being kept in registers and not necessarily immediately stored to memory at the time that the programs modify the values. To understand this concept, consider the following example source program fragment, comprising statements 10 and 20:10A=B 20A=A+D 
In response to statement 10, a non-optimizing compiler might generate machine instructions that read the value of the variable B from the memory location assigned to the variable B and store the value to the memory location assigned to the variable A. In response to statement 20, the non-optimizing compiler might generate machine instructions that read the value of the variable A from the memory location assigned to the variable A, read the value of the variable D from the memory location assigned to the variable D, sum the values, and store the sum to the memory location assigned to the variable A. In contrast, an optimizing compiler might generate machine instructions that store the value of the variable B into a register assigned to the variable A, read the value of the variable D from the memory location assigned to the variable D, sum the value of the variable D and the register assigned to the variable A, and store the sum to the memory location assigned to the variable A. In this way, the optimizing compiler has eliminated a machine instruction that stores the value of the variable D to the memory location assigned to the variable A at statement 10, which may increase performance of the program since register operations may have better performance than memory operations.